package pe.com.casadesign.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.casadesign.dao.SolicitudDAO;
import pe.com.casadesign.domain.Guia;
import pe.com.casadesign.domain.ListaSolicitud;
import pe.com.casadesign.domain.OperacionResultado;
import pe.com.casadesign.domain.Prestamo;
import pe.com.casadesign.domain.Solicitud;
import pe.com.casadesign.service.SolicitudService;
import pe.com.casadesign.service.util.Constantes;

/**
 * Implementacion de SolicitudService.
 * 
 * @author Pedro Vera
 * 
 */
@Service
public class SolicitudServiceImpl implements SolicitudService {
	private static final Logger logger = LoggerFactory.getLogger(SolicitudServiceImpl.class);

    @Autowired
    private SolicitudDAO solicitudDAO;
    
	@Override
	public ListaSolicitud listarSolicitud(Solicitud solicitud) {
		return solicitudDAO.listarSolicitud(solicitud);
	}

	@Override
	public Solicitud obtenerSolicitud(Solicitud solicitud) {
		return solicitudDAO.obtenerSolicitud(solicitud);
	}

	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado registrarSolicitud(Solicitud solicitud) {
		boolean resultado = solicitudDAO.registrarSolicitud(solicitud);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(solicitud.getCodSolicitud()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado registrarSolicitudItem(Solicitud solicitud) {
		boolean resultado = solicitudDAO.registrarSolicitudItem(solicitud);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(solicitud.getCodSolicitud()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}

	@Override
	public Solicitud obtenerSolicitudItem(Solicitud solicitud) {
		return solicitudDAO.obtenerSolicitudItem(solicitud);
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado modificarSolicitud (Solicitud solicitud){
        boolean resultado = solicitudDAO.modificarSolicitud(solicitud)>0;
        //se limpia la solicitud detalle
        boolean resultado1 = solicitudDAO.limpiarSolicitudDetalle(solicitud)>0;
        //se graba el detalle de la solicitud
        resultado1 = solicitudDAO.registrarSolicitudDetalle(solicitud)>0;
        //no se cambia informacion de det_solicitud_item por que si ha un registro no se puede cambiar los valores
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(solicitud.getCodSolicitud()));
		operacionResultado.setEsOK((resultado&&resultado1)?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado modificarSolicitudBulto(Solicitud solicitud){
    boolean resultado = solicitudDAO.modificarSolicitud(solicitud)>0;
        //se limpia la solicitud detalle
    int limpiar = solicitudDAO.limpiarSolicitudDetalleBulto(solicitud);
        //se graba el detalle de la solicitud
    boolean resultado1 = solicitudDAO.registrarSolicitudDetalleBulto(solicitud)>0;
    
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(solicitud.getCodSolicitud()));
		operacionResultado.setEsOK((resultado&&resultado1) ?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado actualizarSolicitud(Solicitud solicitud) {
		boolean resultado = solicitudDAO.actualizarSolicitud(solicitud)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(solicitud.getCodSolicitud()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado actualizarEstadoSolicitud(Solicitud solicitud) {
		boolean resultado = solicitudDAO.actualizarEstadoSolicitud(solicitud)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(solicitud.getCodSolicitud()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado actualizarObservacionesSolicitud(Solicitud solicitud) {
		boolean resultado = solicitudDAO.actualizarEstadoSolicitud(solicitud)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(solicitud.getCodSolicitud()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
}
